home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / SYS / s / FrexxEdStart.rx < prev    next >
Text File  |  1996-09-26  |  8KB  |  258 lines

  1. /*****************************************************************************
  2.  * $VER: FrexxFrontEd v2.6 (10.11.95)
  3.  *
  4.  * Arexx script for FrexxEd as replacement for Ed used with Ced
  5.  * Also used by "freds" and "bin/startfred".
  6.  *
  7.  * Orginally by Daniel Stenberg & Michiel Willems.
  8.  * Altered by Nicolas Dade (nicolas-dade@uiuc.edu) to be more general.
  9.  * Altered by Mogens Isager to be even more general :-).
  10.  * Altered by Nicolas Dade again to fold Mogens' changes into my private version.
  11.  * Altered by Mathias Axelsson to add some command line options
  12.  *
  13.  * NEW FEATURES:
  14.  * (5.2.95) [Nicolas]
  15.  *  o correctly handles relative paths in Filename.
  16.  *  o handles multiple filenames.
  17.  *  o cleaned up STICKY code.
  18.  * (18.2.95) [Nicolas]
  19.  *  o STICKY can appear anywhere in the arguments.
  20.  * (20.2.95) [Daniel/Kjell]
  21.  *  o Added the iconfy-stuff!
  22.  * (23.2.95) [Nicolas]
  23.  *  o it's ok to open more than one new file at once.
  24.  *  o starting with no arguments makes Fred pop up a requester.
  25.  *  o eliminated NOARGS code because NOARGS was never used.
  26.  *  o moved "run Fred" out of loop.
  27.  *  o moved "Deiconify(); WindowToFront();" out of loop.
  28.  * (4.6.95) [Mogens]
  29.  *  o Made some changes to handle no args or just STICKY.
  30.  * (6.6.95) [Nicolas]
  31.  *  o folded some of Mogen's changes into my code
  32.  *  o changed fpl/KillNotify.FPL to be smarter about multiple files and re-iconifying.
  33.  *    This meant adding the global info _iconify_when_quit_countdown that counts the total number of buffers that were opened while iconified.
  34.  *  o ARexxRead()s replaced by having arexx place the variable directly in the FPL code.
  35.  *  o In order to keep the user from deiconifying while we open the files, the command(s) to FrexxEd are built up in arexx, and then sent as one long command.
  36.  *
  37.  * (8.11.95) [Mathias]
  38.  *  o Added some more command line options:
  39.  *    x Left=<#>   Sets left edge of window
  40.  *    x Top=<#>    Sets top edge of window
  41.  *    x Width=<#>  Sets width of window
  42.  *    x Height=<#> Sets height of window
  43.  *    x Window=<#> Sets type of the window. See Functions.guide/ReadInfo()
  44.  *                 for all the types
  45.  *    x Screen=<.> Sets public screen name
  46.  *
  47.  * USAGE/DESCRIPTION:
  48.  *
  49.  * Arguments: rx FrexxEdStart.rx {Filenames} [STICKY] [LEFT=#]
  50.  *                               [TOP=#] [WIDTH=#] [HEIGHT=#] [WINDOW=#] [SCREEN=.]
  51.  *
  52.  * Example  : rx FrexxEdStart S:Startup-Sequence S:User-Startup
  53.  *
  54.  * Note that the shell script Freds calls FrexxEdStart for us, so the above
  55.  * example could also have been written as
  56.  *   freds S:Startup-Sequence S:User-Startup
  57.  *
  58.  ****************************************************************************/
  59.  
  60. OPTIONS RESULTS
  61.  
  62. IF ~SHOW('L', "rexxsupport.library") THEN DO
  63.   IF ~ADDLIB('rexxsupport.library', 0, -30, 0)
  64.   THEN DO
  65.     SAY "couldn't open rexxsupport.library!"
  66.     EXIT 10
  67.   END
  68. END
  69.  
  70. /* get Fred running, even if we have no filenames to pass to Fred */
  71. PortName = 'FREXXED.1'
  72. IF ~SHOW(P, PortName) THEN DO
  73.   ADDRESS COMMAND "Run <nil: >nil: Fred"
  74.   ADDRESS COMMAND "WaitForPort "PortName
  75. END
  76.  
  77. /* parse the command line. inits NunArgs, Name.nnn and Sticky */
  78. /* as well as Left, LeftEdge, Top, TopEdge, Width, WidthSize  */
  79. /* Height, HeightSize                                         */
  80.  
  81. PARSE ARG CmdLine
  82.  
  83. NumArgs = 0
  84. Sticky = 0
  85. Left = 0
  86. Top = 0
  87. Width = 0
  88. Height = 0
  89. Window = 0
  90. Screen = 0
  91.  
  92. DO UNTIL CmdLine = ""
  93.   CmdLine = STRIP(CmdLine)
  94.   IF LEFT(CmdLine,1) = '"' THEN DO
  95.     NumArgs = NumArgs + 1
  96.     PARSE VAR CmdLine '"' Name.NumArgs '"' CmdLine
  97.   END
  98.   ELSE DO
  99.     NumArgs = NumArgs + 1
  100.     PARSE VAR CmdLine Name.NumArgs CmdLine
  101.   END
  102.   
  103.   IF Name.NumArgs="" THEN
  104.     NumArgs = NumArgs - 1 /* ignore empty arguments */
  105.   
  106.   IF UPPER(Name.NumArgs) = "STICKY" & ~Sticky THEN DO /* if sticky appears twice then the second time it refers to a file */
  107.     Sticky = 1
  108.     NumArgs = NumArgs - 1 /* sticky will not be counted in NumArgs */
  109.   END
  110.   
  111.   IF UPPER(Left(Name.NumArgs,4)) = "LEFT" & ~Left THEN DO
  112.     Left = 1
  113.     parse var Name.NumArgs'='LeftEdge
  114.     NumArgs = NumArgs - 1
  115.   END
  116.   
  117.   IF UPPER(Left(Name.NumArgs,3)) = "TOP" & ~Top THEN DO
  118.     Top = 1
  119.     parse var Name.NumArgs'='TopEdge
  120.     NumArgs = NumArgs - 1
  121.   END
  122.   
  123.   IF UPPER(Left(Name.NumArgs,5)) = "WIDTH" & ~Width THEN DO
  124.     Width = 1
  125.     parse var Name.NumArgs'='WidthSize
  126.     NumArgs = NumArgs - 1
  127.   END
  128.   
  129.   IF UPPER(Left(Name.NumArgs,6)) = "HEIGHT" & ~Height THEN DO
  130.     Height = 1
  131.     parse var Name.NumArgs'='HeightSize
  132.     NumArgs = NumArgs - 1
  133.   END
  134.   
  135.   IF UPPER(Left(Name.NumArgs,6)) = "WINDOW" & ~Window THEN DO
  136.     Window = 1
  137.     parse var Name.NumArgs'='WindowType
  138.     NumArgs = NumArgs - 1
  139.   END
  140.   
  141.   IF UPPER(Left(Name.NumArgs,6)) = "SCREEN" & ~Screen THEN DO
  142.     Screen = 1
  143.     parse var Name.NumArgs'='ScreenName
  144.     NumArgs = NumArgs - 1
  145.   END
  146. END
  147.  
  148. /* if Sticky then setup a port for us to use */
  149. OurPort="ED_FREXXED.no port"
  150. IF Sticky THEN DO
  151.   i = 1
  152.   cont = 0
  153.   DO while i<100 /* no more than 100 simultaneous startups! */
  154.     IF ~SHOW("P", "ED_FREXXED."i) THEN DO
  155.     OurPort = "ED_FREXXED."i
  156.     cont = OPENPORT(OurPort)
  157.     IF cont THEN i = 100 /* we might not get the port if someone else creates it between the SHOW() and the OPENPORT() */
  158.     END
  159.     i = i + 1
  160.   END
  161.   IF ~cont THEN DO
  162.     SAY "We found no free port to use!"
  163.     EXIT(5)
  164.   END
  165. END
  166.  
  167. /* Because of problems with the user tweaking the window while the files are being opened, I accumulate all the fpl code in FPLCode and then execute it all at once at the end */
  168. FPLCode = 'int ID, oldID;'
  169.  
  170. /* if files where specified, load each file into FrexxEd */
  171. IF NumArgs > 0 THEN DO
  172.  
  173.   /* make sure KillNotify.FPL has been loaded, and add our NumArgs to the iconify countdown */
  174.   IF Sticky THEN DO
  175.     FPLCode = FplCode||'ID = GetBufferID();
  176.      ReadInfo("_iconify_when_quit_countdown", ID);
  177.      if (GetErrNo()) {
  178.        ExecuteFile("KillNotify.FPL");
  179.      }
  180.      if (ReadInfo("iconify", ID)) {
  181.        SetInfo(ID, "_iconify_when_quit_countdown", 'NumArgs' + ReadInfo("_iconify_when_quit_countdown", ID));
  182.      }'
  183.   END
  184.   
  185.   DO n=1 TO NumArgs
  186.     File = Name.n
  187.  
  188.     /* if File does not contain an absolute path then prepend the current dir to it */
  189.     IF File~="" & POS(":",File)=0 THEN DO
  190.       CDir = PRAGMA("D")
  191.       IF RIGHT(CDir,1)~=":" THEN CDir=CDir"/"
  192.       File = CDir||File
  193.     END
  194.  
  195.     FPLCode = FPLCode||'ID = New();
  196.      if (ID) {
  197.        CurrentBuffer(ID);
  198.        Activate(ID, -1, oldID);
  199.        Open("'File'");
  200.        if ('Sticky') {
  201.      SetInfo(ID, "_notifyport", "'OurPort'");
  202.      SetInfo(ID, "_iconify_when_quit", ReadInfo("iconify"));
  203.        }
  204.      }
  205.      else {
  206.        ARexxSet("Sticky", "0");
  207.      }'
  208.   END
  209. END
  210.  
  211. ELSE DO /* NumArgs = 0 */
  212.   /* have Fred open a file requester---the user can choose as many files as they like */
  213.   /* note that Sticky doesn't work with filerequested files */
  214.   FPLCode = FPLCode||'ID = Open("");'
  215. END
  216.  
  217. IF Left THEN DO
  218.   FPLCode = FPLCode||'SetInfo(ID, "window_xpos", 'LeftEdge');'
  219. END
  220. IF Top THEN DO
  221.   FPLCode = FPLCode||'SetInfo(ID, "window_ypos", 'TopEdge');'
  222. END
  223. IF Width THEN DO
  224.   FPLCode = FPLCode||'SetInfo(ID, "window_width", 'WidthSize');'
  225. END
  226. IF Width THEN DO
  227.   FPLCode = FPLCode||'SetInfo(ID, "window_height", 'HeightSize');'
  228. END
  229. IF Window THEN DO
  230.   FPLCode = FPLCode||'SetInfo(ID, "window", 'WindowType');'
  231. END
  232. IF Screen THEN DO
  233.   FPLCode = FPLCode||'SetInfo(ID, "public_screen", "'ScreenName'");'
  234. END
  235.  
  236. /* force the Fred window into view */
  237. FPLCode = FPLCode||'Deiconify(); WindowToFront();'
  238.  
  239. /* say FPLCode when debugging! */
  240.  
  241. /* send all the accumulated code to FrexxEd */
  242. ADDRESS VALUE PortName
  243. FPLCode
  244. ADDRESS
  245.  
  246. /* if Sticky then wait for NumArgs kill notifications to show up in OurPort */
  247. IF Sticky THEN DO
  248.   DO n=1 TO NumArgs
  249.     DO WHILE ~WAITPKT(OurPort) /* wait for a packet */
  250.     END
  251.     packet = GETPKT(OurPort) /* get packet, but ignore contents! */
  252.   END
  253. END
  254.  
  255. /*************************************/
  256.  
  257.  
  258.